package cn.ytr.project.util;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

public class FileUploadUtils {

	private FileUploadUtils() {
	}
	
	/**
	 * 上传图片及返回表单传的数据
	 * @param HttpServletRequest req
	 * @param List<FileItem> 供如果之前有解析请求获取参数的，这个参数就得填解析的集合
	 * @return
	 */
	public static Map<String,Object> upload(HttpServletRequest req, List<FileItem> items) {
		Map<String,Object> map = new HashMap<String, Object>();
		try {
			// 文件上传处理
			//没有解析请求的话我们才去解析
			if (items == null) {
				// 创建创建FileItem对象的工厂
				FileItemFactory factory = new DiskFileItemFactory();
				// 创建文件上传处理器
				ServletFileUpload upload = new ServletFileUpload(factory);
				//设置上传文件的大小
				upload.setFileSizeMax(1024*1024*2);
				// 解析请求,得到一个一个的FileItem对象(FileItem对象--->一个表单元素)
				items = upload.parseRequest(req);
			}
			
			//遍历解析结果，并且区分普通表单元素和文件上传表单元素
			for (FileItem fileItem : items) {
				if (fileItem.isFormField()) {
					// 普通表单元素 name
					String value = fileItem.getString("utf-8");
					String key = fileItem.getFieldName();
					map.put(key, value);
					
				} else {
					// 文件上传表单元素 headImg
					if (StringUtil.hasLength(fileItem.getString())){
						// 约束文件的类型
						if (!fileItem.getContentType().startsWith("image/")) {
							throw new LogicException("亲,文件类型不正确");
						}
						
						// 生成不重复的文件名称
						String name = UUID.randomUUID().toString();
						// 获取真实文件的扩展名
						String extension = FilenameUtils.getExtension(fileItem.getName());
	
						// 获取项目中的资源在磁盘中的路径
						String realPath = req.getServletContext().getRealPath("/upload");
						map.put("imgPath", "/upload/"+name + "." + extension);
						// 将上传文件保存到磁盘中
						fileItem.write(new File(realPath, name + "." + extension));
					}
				}
			}
		} catch (FileSizeLimitExceededException e) {
			throw new LogicException("亲,文件太大",e);
		} catch (LogicException e) {
			throw e;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return map;
	}

	
}
